package com.vf.admin.client.service;

import com.vf.admin.client.dao.AppUserDao;
import com.vf.admin.client.dto.RoomMemberDto;
import com.vf.admin.common.entity.Result;
import com.vf.admin.common.splitpage.SplitPageBean;
import com.vf.admin.miaodong.entity.AppUser;
import org.springframework.web.multipart.MultipartFile;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 用户管理
 *
 * @author anxiang
 */
public interface AppUserService {

    /**
     * 查询列表
     */
    List<AppUser> list(Map<String, Object> paraMap, SplitPageBean splitPage);


    /**
     * 查询1V1主播列表
     * status 类型
     *
     * @return
     */
    List<AppUser> oneUsers(Integer userId, Integer status, SplitPageBean splitPageBean);

    /**
     * 搜索条件搜索
     *
     * @param sousuo
     * @param page
     * @return
     */
    public List<AppUser> getSearch(String sousuo, SplitPageBean page);

    /**
     * 详情
     */
    AppUser get(Integer id);

    AppUser gets(Integer id);

    AppUser getUserInfo(Integer id, String loginname, String tengxuncode);

    AppUser getFromDB(Integer id);

    AppUser getByTxCode(Integer id);

    AppUser getAndSetAuthStatus(Integer id);

    /**
     * 行级锁，数据更新使用
     *
     * @param id
     * @return
     */
    AppUser lockGet(Integer id);

    /**
     * 根据腾讯code或者id获取详情
     */
    AppUser getTcOrId(Integer id);

    /**
     * 添加/修改
     */
    void save(AppUser haoYou);

    /**
     * 后天管理获取所有用户
     *
     * @param map
     * @param bean
     * @return
     */
    List<AppUser> findList(Map<String, Object> map, SplitPageBean bean);


    /**
     * 统计用户总数
     * @param map
     * @return
     */
    List<AppUser> userCount(Map<String, Object> map);

    /**
     * 根据邀请码查询用户
     *
     * @param code
     * @return
     */
    AppUser getUserByCode(String code);

    /**
     * 根据usercode查询用户
     *
     * @param usercode
     * @return
     */
    AppUser getUserCode(String usercode);

    List<AppUser> getInvitationCode(String invitationcode);


    List<AppUser> getUserIdList();


    List<AppUser> findAllList();

    //修改用户账号状态
    void upstate(Integer id, Integer state);

    /**
     * 修改用户在线状态    0直播中   1在线   2离线
     */
    void onlineUpstate(Integer id, Integer state);

    /**
     * 修改用户发送文字消息数量
     *
     * @param state 1表示重新计数  2不重新
     */
    void addMessage(Integer id, Integer state);

    /**
     * 修改用户上一次所在的房间腾讯code
     */
    void lastroomtxcode(Integer id, Integer roomtxcode);

    /**
     * 账号，密码查询用户信息
     *
     * @Param: [loginname 账号，password 密码]
     * @return: com.vf.admin.miaodong.entity.AppUser
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     */
    AppUser findByUser(String loginname, String password);


    /**
     * 账号查询用户信息
     */
    AppUser findByLoginname(String loginname);

    void addJindou(Integer userId, BigDecimal number);

    /**
     * 谷歌ID查询用户信息
     */
    AppUser findByGooleId(String id);


    /**
     * faccbackID查询用户信息
     */
    AppUser findByFaccBackId(String id);


    /**
     * 苹果ID查询用户信息
     */
    AppUser findByAppleBackId(String id);


    /**
     * 获取所有在线的用户信息
     *
     * @return: com.vf.admin.miaodong.entity.AppUser
     * @Author: xzx
     * @Date: 2021/07/21
     */
    List<AppUser> zaixianList();

    /**
     * 获取所有会员
     *
     * @return: com.vf.admin.miaodong.entity.AppUser
     * @Author: xzx
     * @Date: 2021/07/21
     */
    List<AppUser> huiyuanList();

    /**
     * 查询过期会员
     *
     * @return
     */
    List<AppUser> vipExpired();

    /**
     * 设置用户会员过期
     *
     * @param userIds
     */
    void updateVipExpire(String userIds);


    /**
     * 找回密码，修改用户密码
     *
     * @Param: [id  用户id, password 密码]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     */
    void upPassword(Integer id, String password);

    /**
     * 修改，保存昵称
     *
     * @Param: [id 用户id, nick 用户昵称]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     */
    void upnick(Integer id, String nick);

    /**
     * 修改，保存身高
     *
     * @Param: [id 用户id, shengao 用户身高]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     */
    void upshengao(Integer id, String shengao, Integer shengaoid);

    /**
     * 修改，保存体重
     *
     * @Param: [id 用户id, tizhong 用户体重]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     */
    void uptizhong(Integer id, String tizhong, Integer tizhongid);

    /**
     * 修改，保存年收入
     *
     * @Param: [id 用户id, nian 年收入]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     */
    void upnianshouru(Integer id, String nian, Integer nianid);


    /**
     * 修改，保存学历
     *
     * @Param: [id 用户id, xueli 学历]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/21 xueli, xueliru
     */
    void upxueli(Integer id, String xueli, Integer xueliId);

    /**
     * 修改，保存职业
     *
     * @Param: [id 用户id, zhiyecode 职业编号，zhiyename 职业名，]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     */
    void upzhiye(Integer id, Integer zhiyecode, String zhiyename);

    /**
     * 修改，保存标签
     *
     * @Param: [id 用户id, biaoqianid 标签id，biaoqianname 标签名，]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     */
    void upbiaoqian(Integer id, String biaoqianid, String biaoqianname);

    /**
     * 修改，保存个性签名
     *
     * @Param: [id, mysign]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     */
    void upMysign(Integer id, String mysign);

    /**
     * 修改，保存支付宝信息
     *
     * @Param: [id 用户ID, name 收款人（支付宝绑定的人）, alipay 支付宝号]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     * @Time: 17:43
     */
    void upAlipay(Integer id, String name, String alipay);

    /**
     * 编辑地址信息
     *
     * @Param: [id 用户id, address 地址,shengid 省id，shiid 市id]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     * @Time: 18:50
     */
    void upAddress(Integer id, String address, Integer shengid, Integer shiid, Integer areaId);

    /**
     * 编辑生日信息
     *
     * @Param: [id 用户id, birthday 生日]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     * @Time: 19:04
     */
    void upbirthday(Integer id, Date birthday);

    /**
     * 编辑头像
     *
     * @Param: [id 用户id, pic 头像]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/22
     * @Time: 9:19
     */
    void uppic(Integer id, String pic);

    /**
     * 完善资料
     *
     * @Param: [id 用户id, pic 头像]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/22
     * @Time: 9:19
     */
    boolean completeMaterial(Integer id, String pic, String nicheng, Integer sex, Date shengri, String yaoqingma, String password,String packageName);

    /**
     * 编辑形象照片
     *
     * @Param: [id 用户id, xxpic 照片]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/22
     * @Time: 9:46
     */
    void upxingxiang(Integer id, String xxpic);

    /**
     * 查询姓名和身份证号是否已存在
     *
     * @param realName
     * @param idNum
     * @return
     */
    boolean existsNameAndIdNum(String realName, String idNum);

    /**
     * 更新用户实名信息
     *
     * @param userId
     * @param realName
     * @param idNum
     */
    void updateRealName(Integer userId, String realName, String idNum);

    void updateEdu(Integer userId, String edu);


    /* 编辑性别
     * @Param: [id 用户id, sex 性别]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/22
     * @Time: 10:36
     */
    void upsex(Integer id, Integer sex);

    /**
     * 根据用户账号查询用户
     *
     * @Param: [usercode 用户code]
     * @return: com.vf.admin.miaodong.entity.AppUser
     * @Author: zhouyunyi
     * @Date: 2021/07/21
     */
    AppUser getUsercodeByUser(String usercode);

    /**
     * 根据腾讯code查询用户
     *
     * @Param: [tengxuncode]
     * @return: com.vf.admin.miaodong.entity.AppUser
     * @Author: zhouyunyi
     * @Date: 2021/07/28
     * @Time: 12:41
     */
    AppUser getTengxuncodeByUser(Integer tengxuncode);

    /**
     * 根据腾讯code批量查询用户
     *
     * @Param: [tengxuncode]
     * @return: com.vf.admin.miaodong.entity.AppUser
     * @Author: zhouyunyi
     * @Date: 2021/07/28
     * @Time: 12:41
     */
    List<AppUser> getPiliangTengxuncodeByUser(String tengxuncode);

    /**
     * 根据IDS批量查询用户
     *
     * @param ids
     * @return
     */
    List<AppUser> selectIdsByUser(String ids);

    /**
     * 根据邀请码批量查询用户
     *
     * @Param: [tengxuncode]
     * @return: com.vf.admin.miaodong.entity.AppUser
     * @Author: zhouyunyi
     * @Date: 2021/07/28
     * @Time: 12:41
     */
    List<AppUser> getPiliangYaoqingma(String yaoqingma);

    /**
     * 根据腾讯code批量查询用户
     *
     * @Param: [tengxuncode]
     * @Param: [likecha]模糊查询
     * @return: com.vf.admin.miaodong.entity.AppUser
     * @Author: zhouyunyi
     * @Date: 2021/07/28
     * @Time: 12:41
     */
    List<RoomMemberDto> getBatchTengxuncodeByUser(String tengxuncode, String likecha, SplitPageBean splitPage);


    /**
     * 修改支付密码
     *
     * @Param: [paypassword 支付密码]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/28
     * @Time: 17:01
     */
    void upzhifumima(Integer id, String paypassword);

    /**
     * 绑定微信信息
     *
     * @Param: [id 用户id, openid 微信openid]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/07/29
     * @Time: 11:25
     */
    void bangdingweixin(Integer id, String openid);

    /**
     * 阿里云oss上传
     *
     * @param file 文件
     */
    public String aliyunOssupload(MultipartFile file);

    /**
     * 实名认证图片上传验证
     *
     * @Param: [file]
     * @return: java.lang.String
     * @Author: zhouyunyi
     * @Date: 2021/07/5
     * @Time: 11:28
     */
    String aliyunRenzhengUpload(MultipartFile file);

    /**
     * 阿里云oss上传视频
     *
     * @Param: [file]
     * @return: com.vf.admin.common.entity.Result
     * @Author: zhouyunyi
     * @Date: 2021/07/22
     * @Time: 15:45
     */
    Result aliyunOssShipingUp(MultipartFile file);

    /**
     * @Description 获取附近人
     * @Param: lon 经度 , lat 维度, id 用户主键id, sex 性别
     * @return: java.util.List<com.vf.admin.miaodong.entity.AppUser>
     * @Author: ljx
     * @Date: 2021/07/22
     */
    public List<AppUser> getFujinRenList(Map<String, Object> paraMap, SplitPageBean splitPageBean);

    /**
     * @Description 获取在线异性用户
     * @Param: id 用户主键id, sex 性别
     * @return: java.util.List<com.vf.admin.miaodong.entity.AppUser>
     * @Author: ljx
     * @Date: 2021/07/22
     */

    public List<AppUser> getZaixianYixingList(Integer id, Integer sex);


    /*
     * @Description 更新用户礼物特效操作
     * @Param: [id,用户ID  leixing 操作类型]
     * @return: void
     * @Author: ljx
     * @Date: 2021/07/22
     */
    public void updateLiWu(Integer id, Integer leixing);

    /*
     * @Description 更新用户附近操作
     * @Param: [id, leixing]
     * @return: void
     * @Author: ljx
     * @Date: 2021/10/22
     */
    public void updateweizhi(Integer id, Integer leixing);

    public void updatejinbi(Integer id, BigDecimal jinbi);

    /**
     * 减少用户金豆
     *
     * @Param: [id, jinbi]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/10/28
     * @Time: 16:10
     */
    void subJindou(Integer id, BigDecimal beans);

    /* AccountUtil(调用)
     * @Description 更新钻石数量
     * @Param: [id, zuanshi]
     * @return: void
     * @Author: ljx
     * @Date: 2021/10/24
     */
    void updateZuanShi(Integer id, BigDecimal zuanshi);

    /**
     * 减少钻石数量
     *
     * @Param: [id, zuanshi]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/10/28
     * @Time: 16:10
     */
    void upJianZuanShi(Integer id, BigDecimal zuanshi);

    /* AccountUtil(调用)
     * @Description 更新魅力值数量
     * @Param: [id, meili]
     * @return: void
     * @Author: ljx
     * @Date: 2021/10/24
     */
    public void updatemeili(Integer id, Integer meili);

    /**
     * 减少魅力值
     *
     * @Param: [id, meili]
     * @return: void
     * @Author: zhouyunyi
     * @Date: 2021/10/28
     * @Time: 16:11
     */
    void upJianmeili(Integer id, Integer meili);

    void addJinbi(Integer id, BigDecimal jinbi, String mark);

    void subJinbi(Integer id, BigDecimal jinbi, String mark);

    void addDiamonds(Integer id, BigDecimal zuanshi, String mark);

    void addCharm(Integer id, Integer meili, String mark);


    /**
     * 用户动态总数变更
     *
     * @param id      用户id
     * @param leixing 1增加  2减少
     */
    public void dongtaiallUpdate(Integer id, Integer leixing);

    /**
     * 用户新增动态数增加
     *
     * @param id 用户id
     */
    public void dongtaiNewUpdate(Integer id);

    /**
     * 变更用户的免费时长
     *
     * @param freetime 免费时长
     * @param id       id
     * @param type     操作类型 1增加  2减少
     * @param id       用户id
     */
    public void updateFreeTime(Integer id, Integer type, Integer freetime);

    /**
     * 用户新增动态数清空
     *
     * @param id 用户id
     */
    public void dongtaiNewClear(Integer id);

    /**
     * 用户关注总量变更
     *
     * @param id      用户id
     * @param leixing 1增加  2减少
     */
    public void guanzhuUpdate(Integer id, Integer leixing);

    /**
     * 房间收藏数变更
     *
     * @param id      用户id
     * @param leixing 1增加  2减少
     */
    public void roomCollectUpdate(Integer id, Integer leixing);

    /**
     * 用户粉丝总量变更
     *
     * @param id      用户id
     * @param leixing 1增加  2减少
     */
    public void fansnumallUpdate(Integer id, Integer leixing);

    /**
     * 用户新增粉丝数增加
     *
     * @param id 用户id
     */
    public void fensiNewUpdate(Integer id);

    /**
     * 用户新增粉丝数清空
     *
     * @param id 用户id
     */
    public void fensiNewClear(Integer id);


    /**
     * 获取所有用户
     * xzx
     *
     * @return
     */
    List<AppUser> allList();


    /**
     * @Description 更新用户经纬度
     * @Param:
     * @return:
     * @Author: ljx
     * @Date: 2021/10/29
     */
    public void updateLonAndLat(Integer id,String address,String addressdetail,  String lon, String lat);

    /**
     * @Description 更新用户贵族状态
     * @Param:
     * @return:
     * @Author: ljx
     * @Date: 2021/10/29
     */
    public void updateGuizu(Integer id, Integer guizuid);

    /**
     * @Description 清除用户贵族状态
     * @Param:
     * @return:
     * @Author: ljx
     * @Date: 2021/10/29
     */
    public void RevokeGuizu(Integer id);

    /**
     * @Description 注册用户
     * @Param: phone 手机号
     * @Param: password 密码
     * @Param: invitationcode 邀请码
     * @return:
     * @Author: ljx
     * @Date: 2021/10/29
     */
    public boolean registeredUser(String phone, String password, String invitationcode ,String mobileSpec,String packageName);

    List<AppUser> getSonUser(String parentCode);

    /**
     * AccountUtil(调用)
     *
     * @Description 增加用户累积充值金额
     * @Param: [id, zuanshi]
     * @return: void
     * @Author: ljx
     * @Date: 2021/10/24
     */
    public void updateLeijiChongzhi(Integer id, BigDecimal money);

    /**
     * 获取批量用户信息
     *
     * @param arr 用户id 拼接
     * @return
     */
    public List<AppUser> getPiliang(String arr);


    void updateExperience(Integer userid, BigDecimal experience);

    void updateqiandao(int i, Integer id);

    void familyPunchIn(int i, Integer id);

    /**
     * 开启或关闭用户的直播权限
     *
     * @param tUserId
     * @return
     */
    AppUser openOrCloseUserLivePerm(Integer tUserId);

    /**
     * 禁止登录
     *
     * @param tUserId
     * @return
     */
    AppUser forbidLogin(Integer tUserId);

    void savePassword(String payPassword, Integer userId);

    void updateLevelAndExperience(Integer id, int i, BigDecimal experience);

    void update(AppUser user);

    //增加魅力值 魅力值升级
    void addCharmAndUpLevel(Integer userId, Integer charmValue);

    //保存消息价格设置
    void saveMessagePrice(Integer userId, Integer type, String price);

    //修改消息开关状态
    void updateMessageStatus(Integer userId, Integer type);

    Boolean isEnough(Integer userId, BigDecimal diamonds);

    Boolean isEnoughGold(Integer userId, BigDecimal jinbi);

    AppUser randomMatchUser(Integer sex, String biaoqianid, String lon, String lat);

    List<AppUser> sameCityMatch(Integer userId, Integer sex, Integer shiid, Integer matchNum, BigDecimal payDiamonds, String textContent);

    void openYoung(Integer userId, String pass);

    void closeYoung(Integer userId);

    AppUser findUserByThirdToken(String type, String token);

    void updateUserThirdToken(Integer userId, String type, String token);

    boolean addUserThirdToken(String phone, String thirdToken, String type);

    List<AppUser> findUserListBySex(Integer sex);

    List<AppUser> findUserListByShuJuAndSex(Integer sex);

    boolean isVip(Integer userId);

    Map<String, Object> isVipMap(Integer userId);

    List<AppUser> findOnlineUserListBySex(Integer sex, String ignoreUserIds, int limit);


    List<AppUser> findOnlineUser(Integer online);

    /**
     * 修改手机型号
     */
    void updateMobileSpec(Integer userId,String mobileSpec);
    void upweChatNum(Integer id, String weChatNum);


    /**
     * 修改手机型号
     */
    void updateOnlinestatus(Integer userId,Integer onlinestatus);


    //修改用户账号状态
    void upstateWindowTicket(Integer id);


    //黑名单
    List<AppUser> isBlackList();

    //
    List<AppUser> getUserInfoSearch(String loginNames);

    //
    AppUser getUserAccount(String account);

    /**
     *
     * @param sex
     * @param isReal
     * @return
     */
    List<AppUser> findUpDataList(Integer sex,Integer isReal);


}
